// 当一个函数有多个参数的时候先传递一部分的 参数调用它（这部分的参数以后永远不会变）
// 然后返回一个新的函数接受剩余的参数，返回结果
const _ = require('lodash')

// 柯理化解决代码中硬编码的问题
// function checkAge (age) {
//     let min = 18
//     return age >= min
// }

// 普通纯函数
// function checkAge (min, age) {
//     return age >= min
// }

// 柯里化
// function checkAge(min) {
//     return function(age) {
//         return age >= min
//     } 
// }

// ES6写法
// let checkAge = min => {age => age >= min}

// let checkAge18 = checkAge(18)
// let checkAge20 = checkAge(20)

// checkAge18(24)
// checkAge20(20)


// lodash中的柯里化函数

//_.curry
// 要柯里化的函数
// function getSum(a, b, c) {
    // return a + b + c
// }
// 柯里化后的函数
// let curried = _.curry(getSum)
// 测试
// console.log(curried(1, 2, 3))
// console.log(curried(1)(2)(3))
// console.log(curried(1, 2)(3))

// 案例
// const match = _.curry(function(reg, str){
//     return str.match(reg)
// })
// const haveSpace = match(/\s+/g)
// const haveNumber = match(/\d+/g)

// console.log(haveSpace('hello world'));
// console.log(haveNumber('25$'));

// const filter = _.curry(function(func, array) {
//     return array.filter(func)
// })

// console.log(filter(haveSpace, ['John Connor', 'John_Donne']))

// const findSpace  = filter(haveSpace)
// console.log(findSpace(['John Connor', 'John_Donne']))

// 模拟_.curry()的实现
function curry(func) {
    console.log("func: " + func )
    return function curriedFn(...args) {
        console.log("args: " + args)
        console.log(func.length)
        // 判断实参和形参的个数
        if(args.length < func.length) {
            return function() {
                return curriedFn(...args.concat(Array.from(arguments)))
            }
        }
        // 实参和形参个数相同，调用func，返回结果
        return func(...args)
    }
}


// 案例
function getSum(a, b, c) {
    return a + b + c
}
// 柯里化后的函数
let curried = curry(getSum)
// 测试
console.log(curried(1, 2, 3))
console.log(curried(1)(2)(3))
console.log(curried(1, 2)(3))
